// 引入Vue
import store from '@/store'
import { Message } from 'element-ui'
import Vue from 'vue'
// 引入vue-router
import VueRouter from 'vue-router'
// 引入routes
import routes from './routes'
// 声明使用vue-router插件
Vue.use(VueRouter)
// 改造push和replace的方法
const originPush = VueRouter.prototype.push

// 重写这个方法
VueRouter.prototype.push = function (location, onComplete = () => { }, onAbort) { 
  return  originPush.call(this,location, onComplete, onAbort)
}
const originReplace = VueRouter.prototype.replace
// 重写这个方法
VueRouter.prototype.replace = function (location, onComplete, onAbort = () => { }) {
  return originReplace.call(this, location, onComplete, onAbort)
}
// 实例化路由器对象并暴露出去
const router = new VueRouter({
  mode: 'history',
  routes,
  //加入滚动条复原
  scrollBehavior(to,from,savedPosition) {
   return {x:0,y:0}
  },
})
//加入全局路由守卫
const checkPaths = ['/trade','/pay','/center']

router.beforeEach(async (to,from,next)=>{
  //1.获取要跳转到页面
  const targetPath = to.path
  //2.判断是否需要判断需要用户信息
  const needPath = checkPaths.some(path=>targetPath.startsWith(path))
  //3.简化代码之先获取用户信息
  const {userInfo,token} = store.state.user
  //4.用户为登录状态，走吧
  if(userInfo.name){
    next()
    return  //后面的代码不需要执行了
  }
  //5.没有userinfo，看看有没有token
  if(token){
    try{
      //调用获取用户信息接口，通过token，在user->store下会 commit userinfo信息
      await store.dispatch('getUserInfo')
      next()
      return
    }catch(e){
      Message.error(e.message + ',请重新登录')
      //清空无效的token数据
      store.dispatch('logout')
      router.replace('/login?redirect='+to.path)
      next()
      return
    }
  }
  //6.没有用户信息，也没有token
  if(needPath){
    router.replace('/login?redirect='+targetPath)
    next()
    return 
  }
  //没有用户信息，没有token,不需要登录
  next()
})

export default router